package com.jxdinfo.hussar.example.common.schedulingtask.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jxdinfo.hussar.example.common.schedulingtask.dao.MdItemTypeMapper;
import com.jxdinfo.hussar.example.common.schedulingtask.model.MdItemType;
import com.jxdinfo.hussar.example.common.schedulingtask.scheduleutil.ScheduleUtils;
import com.jxdinfo.hussar.example.common.schedulingtask.service.MdItemTypeService;
import com.jxdinfo.hussar.example.common.schedulingtask.vo.MdItemTypeVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


/**
 * <p>
 * 物料产品分类表 服务实现类
 * </p>
 *
 * @author 乔镔
 * @since 2024-04-02
 */
@Service("com.jxdinfo.hussar.example.common.schedulingtask.service.impl.MdItemTypeServiceImpl")
public class MdItemTypeServiceImpl extends ServiceImpl<MdItemTypeMapper, MdItemType> implements MdItemTypeService {

    private static final Logger logger = LoggerFactory.getLogger(MdItemTypeServiceImpl.class);
    
    @Autowired
    private MdItemTypeService mdItemTypeService;
    
    @Autowired
    private MdItemTypeMapper mdItemTypeMapper;
    
    @Override
    public void manualSynchronization() {
        logger.info("\n手动同步-产品分类表-开始同步产品分类表");
        LocalDateTime nowTime = LocalDateTime.now();
        logger.info("\n手动同步-产品分类表-开始查询erp所有的产品分类表信息");
        // 1查询erp所有的产品分类表信息
        List<MdItemTypeVO> allErpItemTypelist = mdItemTypeMapper.selectAllItemType();
        // 2产品分类表信息转换成主键-对象map集合
        logger.info("\n手动同步-产品分类表-开始把产品分类表信息转换成主键-对象map集合");
        Map<Long, MdItemTypeVO> allErpItemTypeMap = allErpItemTypelist.stream().collect(Collectors.toMap(MdItemTypeVO::getItemTypeId, t -> t));
        // 2把产品分类表信息转换成code-对象map集合
        logger.info("\n手动同步-产品分类表-开始把产品分类表信息转换成code-对象map集合");
        Map<String, MdItemTypeVO> allErpItemTypeCodeMap = allErpItemTypelist.stream().collect(Collectors.toMap(MdItemTypeVO::getItemTypeCode, t -> t));

        // 3产品分类表信息中的id转换成id列表
        logger.info("\n手动同步-产品分类表-开始把产品分类表信息中的id转换成id列表");
        List<Long> erpAllItemTypeIdList = allErpItemTypelist.stream().map(MdItemTypeVO::getItemTypeId).collect(Collectors.toList());
        // 4查询所有的mes产品分类表信息
        logger.info("\n手动同步-产品分类表-开始查询所有的mes产品分类表信息");
        QueryWrapper<MdItemType> mdItemTypeWrapper = new QueryWrapper<>();
        mdItemTypeWrapper.eq("deleted_flag","0");
        List<MdItemType> mesMdItemTypes = mdItemTypeMapper.selectList(mdItemTypeWrapper);
        // 5mes中的物料产品信息转换成id列表,
        List<Long> mesIdList = mesMdItemTypes.stream().map(MdItemType::getItemTypeId).collect(Collectors.toList());
        // 6找出erp中有但是mes中没有的id，这写id需要插入
        ArrayList<Long> erpHasMesNoIdList = new ArrayList<>();
        for (int i = 0; i < erpAllItemTypeIdList.size(); i++) {
            if (!mesIdList.contains(erpAllItemTypeIdList.get(i))) {
                erpHasMesNoIdList.add(erpAllItemTypeIdList.get(i));
            }
        }
        if (erpHasMesNoIdList.size() > 0) {
            // 循环创建对象，保存待要插入的结果
            ArrayList<MdItemType> insertList = new ArrayList<>();
            for (Long insertId : erpHasMesNoIdList) {
                MdItemTypeVO mdItemTypeVO = allErpItemTypeMap.get(insertId);
                MdItemType mdItemType = new MdItemType();
                mdItemType.setItemTypeId(mdItemTypeVO.getItemTypeId());
                mdItemType.setItemTypeName(mdItemTypeVO.getItemTypeName());        // 物料类型名称
                mdItemType.setItemTypeCode(mdItemTypeVO.getItemTypeCode());        // 物料类型编码
                mdItemType.setEnableFlag("1");                                      // 是否生效
                mdItemType.setItemOrProduct("ITEM");                                // 产品物料标识
                // 设置父类型id
                if (mdItemTypeVO.getItemTypeCode() != null && !"".equals(mdItemTypeVO.getItemTypeCode())) {
                    if (mdItemTypeVO.getItemTypeCode().length() == 2){
                        mdItemType.setParentTypeId(Long.parseLong("0"));
                    } else {
                        // 获取编码长度
                        String itemTypeCode = mdItemTypeVO.getItemTypeCode();
                        int length = itemTypeCode.length();
                        // 截取编码去掉后两位结果值
                        String parentCode = itemTypeCode.substring(0, length - 2);
                        // 获取code对应的id
                        Long itemTypeId = allErpItemTypeCodeMap.get(parentCode).getItemTypeId();
                        mdItemType.setParentTypeId(itemTypeId);
                    }
                }
                mdItemType.setScheduleTime(nowTime);
                mdItemType.setCreateBy(mdItemTypeVO.getCreateBy());
                mdItemType.setCreateTime(mdItemTypeVO.getCreateTime());
                mdItemType.setUpdateBy(mdItemTypeVO.getUpdateBy());
                mdItemType.setUpdateTime(mdItemTypeVO.getUpdateTime());
                mdItemType.setErpSortId(mdItemTypeVO.getItemTypeId());
                insertList.add(mdItemType);
            }
            // 设置所有的父类id
            for (MdItemType mdItemType : insertList) {
                List<Long> allParentIds = ScheduleUtils.getAllParentIds(insertList, mdItemType.getItemTypeId());
                StringBuilder stringBuilder = new StringBuilder();
                for (int i = 0; i < allParentIds.size(); i++) {
                    Long aLong = allParentIds.get(i);
                    stringBuilder.append(aLong);
                    if (i < allParentIds.size() - 1) {
                        stringBuilder.append(",");
                    }
                }
                mdItemType.setAncestors(stringBuilder.toString());
            }
            mdItemTypeService.saveBatch(insertList);
        }
        // 7找出erp和mes中都有的，这些需要更新
        ArrayList<Long> updateIdList = new ArrayList<>();
        for (int i = 0; i < mesIdList.size(); i++) {
            if (erpAllItemTypeIdList.contains(mesIdList.get(i))){
                updateIdList.add(mesIdList.get(i));
            }
        }
        if (updateIdList.size()>0) {
            ArrayList<MdItemType> mdItemTypeUpdateList = new ArrayList<>();
            List<MdItemType> mdItemTypeList = mdItemTypeMapper.selectBatchIds(updateIdList);
            for (MdItemType mdItemType : mdItemTypeList) {
                Long erpmdItemTypeSortId = mdItemType.getItemTypeId();
                MdItemTypeVO mdItemTypeVO = allErpItemTypeMap.get(erpmdItemTypeSortId);
                mdItemType.setItemTypeName(mdItemTypeVO.getItemTypeName());        // 物料类型名称
                mdItemType.setItemTypeCode(mdItemTypeVO.getItemTypeCode());        // 物料类型编码
                mdItemType.setEnableFlag("1");                                      // 是否生效
                mdItemType.setItemOrProduct("ITEM");                                // 产品物料标识
                // 父类型id
                if (mdItemTypeVO.getItemTypeCode() != null && !"".equals(mdItemTypeVO.getItemTypeCode())) {
                    if (mdItemTypeVO.getItemTypeCode().length() == 2){
                        mdItemType.setParentTypeId(Long.parseLong("0"));
                    } else {
                        // 获取编码长度
                        String itemTypeCode = mdItemTypeVO.getItemTypeCode();
                        int length = itemTypeCode.length();
                        // 截取编码去掉后两位结果值
                        String parentCode = itemTypeCode.substring(0, length - 2);
                        Long itemTypeId = allErpItemTypeCodeMap.get(parentCode).getItemTypeId();
                        mdItemType.setParentTypeId(itemTypeId);
                    }
                }
                mdItemType.setScheduleTime(nowTime);
                mdItemType.setCreateBy(mdItemTypeVO.getCreateBy());
                mdItemType.setCreateTime(mdItemTypeVO.getCreateTime());
                mdItemType.setUpdateBy(mdItemTypeVO.getUpdateBy());
                mdItemType.setUpdateTime(mdItemTypeVO.getUpdateTime());
                mdItemTypeUpdateList.add(mdItemType);
            }
            mdItemTypeService.updateBatchById(mdItemTypeUpdateList);
        }
    }
}
